<?php
// ------------------------------------------------------------------------
// |@Author       : Jarmin <edshop@qq.com>
// |@----------------------------------------------------------------------
// |@Date         : 2023-05-12 19:20:48
// |@----------------------------------------------------------------------
// |@LastEditTime : 2023-06-03 22:48:37
// |@----------------------------------------------------------------------
// |@LastEditors  : Jarmin <jarmin@ladmin.cn>
// |@----------------------------------------------------------------------
// |@Description  : 
// |@----------------------------------------------------------------------
// |@FilePath     : Dept.php
// |@----------------------------------------------------------------------
// |@Copyright (c) 2023 http://www.ladmin.cn   All rights reserved. 
// ------------------------------------------------------------------------
namespace app\api\model;

use think\admin\Model;

class Dept extends Model
{
    /**
     * 获取部门列表
     * @param  array $data 查询条件，包含部门名称 name（模糊查询）
     * @return array       部门列表，数组形式
     */
    public static function listDept(array $data): array
    {
        // 根据查询条件 $data 组装 SQL 的 WHERE 子句
        $where = !empty($data['name']) ? [["name", "like", "%" . $data['name'] . "%"]] : [["id", ">", 0]];
        // 查询数据库，获取符合条件的所有部门记录
        $depts = static::mk()->where($where)->order('sort', 'asc')->select()->toArray();
        // 返回部门记录列表
        return $depts;
    }
    
    /**
     * 保存部门信息
     * @param  array $data 待保存的部门数据
     * @return array       保存后的部门数据
     */
    public static function saveDept(array $data): array
    {
        $fn = function () use ($data) {
            if (empty($data['id'])) {
                // 如果没有 id 值，则插入数据
                static::mk()->strict(false)->insert($data);
            } else {
                // 如果有 id 值，说明是更新操作
                static::mk()->strict(false)->where('id', $data['id'])->update($data);
            }
            // 返回保存后的部门数据
            return $data;
        };

        return static::mk()->runTransaction($fn);
    }


    /**
     * 删除部门及其所有子部门
     * @param  array $data 待删除部门的数据，包含 ids 字段，待删除部门的 ID 列表
     * @return bool        是否删除成功
     */
    public static function removeDept(array $data): bool
    {
        $fn = function () use ($data) {
            // 找到所有待删除的节点和它们的所有子节点。
            $toDelete = static::mk()->whereIn('id', $data['ids'])->select()->toArray();
            $toDeleteIds = array_column($toDelete, 'id');
            foreach ($toDelete as $item) {
                $toDeleteIds = array_merge($toDeleteIds, static::getDescendantIds($item['id']));
            }

            // 删除所有待删除的节点和它们的所有子节点。
            static::mk()->whereIn('id', $toDeleteIds)->delete();

            return true;
        };

        return static::mk()->runTransaction($fn);
    }
}